`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/04/30 09:22:52
// Design Name: 
// Module Name: data_test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module data_test
(
    input           resetn      ,
    //wr 接口
    input           ud_wr_clk   ,
    output          ud_wde      ,
    output          ud_wvs      ,
    output  [31:0]  ud_wdata    ,
    //rd 接口
    input           ud_rd_clk   ,
    output          ud_rde      ,
    input           ud_rempty   ,
    output          ud_rvs      ,
    input   [31:0]  ud_rdata    
);


wire error              ;
reg  ud_wvs_r           ;
reg  ud_wde_r           ;
reg  ud_rvs_r           ;

reg  [15:0] wr_cnt      ; 
reg  [15:0] rd_cnt      ;
reg  [15:0] delay_cnt   ;

assign ud_rde   = !ud_rempty    ;
assign ud_wdata = {16'd0,wr_cnt};

////////////////////////////delay_cnt//////////////////////
always @(posedge ud_wr_clk)begin
    if(resetn == 1'b0)begin
        delay_cnt <= 0;
        ud_rvs_r <= 1'b0;
    end
    else if(delay_cnt[13:12] == 2'b11) begin //read start delay write 32768 data
        delay_cnt <= delay_cnt;
        ud_rvs_r <= 1'b1;
    end
    else begin
        delay_cnt <= delay_cnt + 1'b1;
    end
end
////////////////////////////write//////////////////////
always @(posedge ud_wr_clk)begin
    if(delay_cnt[13] == 1'b0)begin
        ud_wvs_r <= 1'b0;
        ud_wde_r <= 1'b0;
    end
    else begin
        ud_wvs_r <= 1'b1;
        ud_wde_r <= 1'b1;
    end
end

always @(posedge ud_wr_clk)begin
    if(resetn == 1'b0)begin
        wr_cnt <= 0;
    end
    else begin
        if(ud_wde) 
            wr_cnt <= wr_cnt + 1'b1;
    end
end


////////////////////////////read//////////////////////

always @(posedge ud_rd_clk)begin
    if(resetn == 1'b0)begin
        rd_cnt <= 0;
    end
    else begin
        if(ud_rde) 
            rd_cnt <= rd_cnt + 1'b1;
        else 
            rd_cnt <= rd_cnt;
    end
end

assign error = ud_rde && (rd_cnt != ud_rdata[15:0]);



assign ud_wvs  =   ud_wvs_r;
assign ud_wde  =   ud_wde_r;
assign ud_rvs  =   ud_rvs_r;


ila_256bit ila_256bit (
	.clk(ud_wr_clk), 
	.probe0({'b0,
        ud_rdata[15:0],
        ud_rde,
        error
    }) 
);






endmodule
